package cn.iocoder.yudao.module.eval.service.subject;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.eval.controller.admin.subject.vo.*;
import cn.iocoder.yudao.module.eval.dal.dataobject.subject.EvalSubjectDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 评价科目 Service 接口
 *
 * @author 芋道源码
 */
public interface EvalSubjectService {

    /**
     * 创建评价科目
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createSubject(@Valid EvalSubjectSaveReqVO createReqVO);

    /**
     * 更新评价科目
     *
     * @param updateReqVO 更新信息
     */
    void updateSubject(@Valid EvalSubjectSaveReqVO updateReqVO);

    /**
     * 删除评价科目
     *
     * @param id 编号
     */
    void deleteSubject(Long id);

    /**
     * 获得评价科目
     *
     * @param id 编号
     * @return 评价科目
     */
    EvalSubjectDO getSubject(Long id);

    /**
     * 获得评价科目列表
     *
     * @param ids 编号
     * @return 评价科目列表
     */
    List<EvalSubjectDO> getSubjectList(Collection<Long> ids);

    /**
     * 获得评价科目分页
     *
     * @param pageReqVO 分页查询
     * @return 评价科目分页
     */
    PageResult<EvalSubjectDO> getSubjectPage(EvalSubjectPageReqVO pageReqVO);

    /**
     * 根据计划ID获得科目列表
     *
     * @param planId 计划ID
     * @return 科目列表
     */
    List<EvalSubjectDO> getSubjectListByPlanId(Long planId);

    /**
     * 根据科目类型获得科目列表
     *
     * @param subjectType 科目类型
     * @return 科目列表
     */
    List<EvalSubjectDO> getSubjectListBySubjectType(String subjectType);

    /**
     * 根据计划ID和科目类型获得科目列表
     *
     * @param planId 计划ID
     * @param subjectType 科目类型
     * @return 科目列表
     */
    List<EvalSubjectDO> getSubjectListByPlanIdAndType(Long planId, String subjectType);

    /**
     * 批量创建评价科目
     *
     * @param planId 计划ID
     * @param subjectList 科目列表
     * @return 科目编号列表
     */
    List<Long> batchCreateSubjects(Long planId, List<EvalSubjectSaveReqVO> subjectList);

    /**
     * 复制科目到其他计划
     *
     * @param sourceSubjectIds 源科目编号列表
     * @param targetPlanId 目标计划ID
     * @return 新科目编号列表
     */
    List<Long> copySubjectsToOtherPlan(List<Long> sourceSubjectIds, Long targetPlanId);

    /**
     * 根据模板创建科目
     *
     * @param planId 计划ID
     * @param templateId 模板ID
     * @return 科目编号列表
     */
    List<Long> createSubjectsByTemplate(Long planId, Long templateId);

    /**
     * 获取计划的评价科目列表
     *
     * @param planId 计划ID
     * @return 科目列表
     */
    List<EvalSubjectDO> getSubjectsByPlan(Long planId);

    /**
     * 设置科目考试安排
     *
     * @param subjectId 科目ID
     * @param scheduleReqVO 安排信息
     */
    void setSubjectSchedule(Long subjectId, EvalSubjectScheduleReqVO scheduleReqVO);

    /**
     * 获取科目考试安排
     *
     * @param subjectId 科目ID
     * @return 安排信息
     */
    EvalSubjectScheduleRespVO getSubjectSchedule(Long subjectId);

    /**
     * 设置科目权重
     *
     * @param subjectId 科目ID
     * @param weight 权重
     */
    void setSubjectWeight(Long subjectId, Double weight);

    /**
     * 设置科目及格分
     *
     * @param subjectId 科目ID
     * @param passingScore 及格分
     */
    void setSubjectPassingScore(Long subjectId, Integer passingScore);

    /**
     * 获取科目统计信息
     *
     * @param subjectId 科目ID
     * @return 统计信息
     */
    EvalSubjectStatisticsRespVO getSubjectStatistics(Long subjectId);

    /**
     * 更新科目状态
     *
     * @param subjectId 科目ID
     * @param status 状态
     */
    void updateSubjectStatus(Long subjectId, Integer status);

    /**
     * 获取计划科目统计
     *
     * @param planId 计划ID
     * @return 统计信息
     */
    EvalPlanSubjectStatisticsRespVO getPlanSubjectStatistics(Long planId);

    /**
     * 验证科目配置
     *
     * @param validationReqVO 验证条件
     * @return 验证结果
     */
    EvalSubjectValidationResultRespVO validateSubjectConfig(EvalSubjectValidationReqVO validationReqVO);

}
